package com.hrm.system.service;

import com.hrm.common.entity.PermissionConstants;
import com.hrm.common.service.BaseService;
import com.hrm.common.util.IdWorker;
import com.hrm.domain.system.Permission;
import com.hrm.domain.system.Role;
import com.hrm.system.dao.PermissionDao;
import com.hrm.system.dao.RoleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
public class RoleService extends BaseService<Role> {

    @Autowired
    private RoleDao roleDao;

    @Autowired
    private PermissionDao permissionDao;

    @Autowired
    private IdWorker idWorker;


    /**
     * 保存角色
     */
    public void addRole(Role role) {
        String id = idWorker.nextId() + "";
        role.setId(id);
        roleDao.save(role);
    }

    /**
     * 更新角色
     */
    public void updateRole(Role role) {
        Role temp = roleDao.findById(role.getId()).get();
        temp.setName(role.getName());
        temp.setDescription(role.getDescription());
        roleDao.save(temp);
    }

    /**
     * id查询角色
     */
    public Role findRoleById(String id) {
        return roleDao.findById(id).get();
    }

    /**
     * 分页查询全部角色列表
     * 参数：companyId
     */
    public Page<Role> findRoles(String companyId, Integer page, Integer size) {
        //1、根据map参数构造可变查询条件
        //2、分页,new PageRequest过时，使用PageRequest.of静态方法，注意page是从0开始，需要-1
        return roleDao.findAll(setSpec(companyId), PageRequest.of(page - 1, size));
    }

    /**
     * id删除角色
     */
    public void deleteRole(String id) {
        roleDao.deleteById(id);
    }

    /**
     * 分配权限（菜单+按钮+api）
     *
     * @param roleId
     * @param permIds
     */
    public void asignPerms(String roleId, List<String> permIds) {
        //查找role
        Role role = roleDao.findById(roleId).get();
        //查找权限并封装到set
        Set<Permission> perms = new HashSet<Permission>();
        for (String permId : permIds) {
            //根据父id和类型查询菜单或按钮中的api集合
            Permission permission = permissionDao.findById(permId).get();
            List<Permission> apiList = permissionDao.findByTypeAndParentId(PermissionConstants.PY_API, permission.getId());
            perms.addAll(apiList); //api权限
            perms.add(permission); //菜单和按钮权限
        }
        role.setPermissions(perms);
        roleDao.save(role);
    }
}
